#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

typedef void (*general_protocol_update_cb)(void);

typedef struct {
  uint8_t _0 : 1;
  uint8_t _1 : 1;
  uint8_t _2 : 1;
  uint8_t _3 : 1;
  uint8_t _4 : 1;
  uint8_t _5 : 1;
  uint8_t _6 : 1;
  uint8_t _7 : 1;
} _8bit;

typedef union {
  /* 通用的数据处理联合体 */
  /* 使用场景举例：想一位一位设置一Byte的数据 */
  uint8_t data;
  _8bit   bit;
} uint8_bit;

typedef union {
  /* 通用的数据处理联合体 */
  /* 使用场景举例：设置的16位数据，获取高低字节 */
  /* general_protocol中在帧数据使用 */
  uint8_bit byte[8];
  uint16_t  word_16;
  uint32_t  word_32;
  uint64_t  word_64;
} typ_iow;

typedef struct {
  char*                      name;       /* 指令名称 */
  uint16_t                   can_id;     /* 指令ID */
  typ_iow                    frame_data; /* 帧数据 */
  general_protocol_update_cb update_cb;  /* 数据更新回调函数 */
} can_protocol_t;

void     protocol_table_reg(can_protocol_t* table, uint16_t table_size);
void     protocol_table_all_dump(void);
bool     protocol_table_dump_by_can_id(uint16_t can_id);
bool     protocol_table_get_data_by_canid(uint16_t can_id, uint64_t* data);
uint32_t protocol_table_get_table_array_size(void);

bool protocol_table_get_byte_by_canid(uint16_t can_id, uint8_t byte_number, uint8_t* data);
bool protocol_table_set_byte_by_canid(uint16_t can_id, uint8_t byte_number, uint8_t data);